package controllers;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;


import models.*;
import play.*;
import play.mvc.*;

@With(Secure.class)
public class Stages extends CRUD {

	@Before
	static void setConnectedUser() {
		if(Security.isConnected()) {
			Agent agent = Agent.find("byEmail", Security.connected()).first();
			renderArgs.put("agent_email", agent.email);
			renderArgs.put("agent_fullname", agent.fullname());
			renderArgs.put("agent_responsable", agent.getCisService().isResponsable(agent));
			renderArgs.put("agent_orga", agent.isOrgaStage(agent));
			renderArgs.put("resp", (agent.isOrgaStage(agent) || SystemSDIS.getSystemSDIS().isResponsableDepartemental(agent)));
			System.out.println((agent.isOrgaStage(agent) || SystemSDIS.getSystemSDIS().isResponsableDepartemental(agent)));
			System.out.println(agent.isOrgaStage(agent));
			if(agent.niv.id != 0){
				renderArgs.put("agent_for", agent.niv);
			}
			renderArgs.put("agent_respPedago", SystemSDIS.getSystemSDIS().isResponsableDepartemental(agent));
		}
	}

	//Affiche le formulaire
	public static void newStageForm(){
		Agent agent = Agent.find("byEmail", Security.connected()).first();
		if (agent.niv.niv!=4){
			render("@accessDenied");
		}
		else{
			List<Agent> agents = Agent.all().fetch();
			List<Nature> natures = Nature.all().fetch();
			List<StructureCoord> structures = StructureCoord.all().fetch();
			List<EtatStage> etats=EtatStage.all().fetch();
			List<Intitule> intitules=Intitule.all().fetch();
			List<Lieu> lieux = Lieu.all().fetch();
			render(agents, agent, natures, etats, structures, intitules, lieux);
		}
	}

	//Affiche le formulaire après l'envoi et enregistre le stage dans la base de données si le formulaire
	//est rempli correctement
	public static void newStageSave(String code, long intitule, long nature, long structure, int effectifMin, 
			int effectifMax, String modalites, long lieu, String description, long duree, 
			Date dateDeb, Date dateFin, Date dateExam){
		Agent agent = Agent.find("byEmail", Security.connected()).first();
		if (agent.niv.niv!=4){
			render("@accessDenied");
		}
		else{
			long id=1;
			EtatStage etat=EtatStage.findById(id);
			Nature natureObj=Nature.findById(nature);
			StructureCoord structureObj=StructureCoord.findById(structure);
			Intitule intituleObj=Intitule.findById(intitule);
			Lieu lieuObj=Lieu.findById(lieu);

			//Récupère les informations des différents éléments à afficher dans les listes déroulantes
			List<Agent> agents = Agent.all().fetch();
			List<Nature> natures = Nature.all().fetch();
			List<StructureCoord> structures = StructureCoord.all().fetch();
			List<EtatStage> etats=EtatStage.all().fetch();
			List<Intitule> intitules=Intitule.all().fetch();
			List<Lieu> lieux = Lieu.all().fetch();

			if(natureObj!=null){
				natures.remove(natureObj);
			}
			if(structureObj!=null){
				structures.remove(structureObj);
			}
			if(intituleObj!=null){
				intitules.remove(intituleObj);
			}
			if(lieuObj!=null){
				lieux.remove(lieuObj);
			}
			//Vérification des dates et changement du format pour pré-remplissage en cas d'erreur 
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			String dateDebS=sdf.format(dateDeb);
			String dateFinS=sdf.format(dateFin);
			String dateExamS;
			if(dateExam==null){
				dateExamS=sdf.format(dateFin);
			}
			else{
				dateExamS=sdf.format(dateExam);
			}
			Stage stage;
			//Test sur les dates
			if(dateFin.before(dateDeb)){
				if(dateExam==null){
					stage=new Stage(code, intituleObj, natureObj, structureObj, effectifMin, effectifMax, modalites, lieuObj, description, etat,duree, dateDeb, dateFin, dateFin, null, null);
				}
				else{
					stage=new Stage(code, intituleObj, natureObj, structureObj, effectifMin, effectifMax, modalites, lieuObj, description, etat,duree, dateDeb, dateFin, dateExam, null, null);
				}
				flash.error("La date de fin du stage n'est pas valide, elle doit être postérieur à la date de début");
				render("@newStageForm", stage, agent, agents, natures, etats, structures, intitules, dateDebS, dateFinS, dateExamS, lieux);
			}
			else{
				if(dateExam==null){
					stage=new Stage(code, intituleObj, natureObj, structureObj, effectifMin, effectifMax, modalites, lieuObj, description, etat,duree, dateDeb, dateFin, dateFin, null, null);
				}
				else{
					stage=new Stage(code, intituleObj, natureObj, structureObj, effectifMin, effectifMax, modalites, lieuObj, description, etat,duree, dateDeb, dateFin, dateExam, null, null);
				}
				validation.valid(stage);
				if(validation.hasErrors()){
					flash.error("Il y a une erreur dans le formulaire");
					render("@newStageForm", stage, agent,agents, natures, etats, structures, intitules, dateDebS, dateFinS, dateExamS,lieux);
				}
				stage.save();
				flash.success("Le stage a bien été enregistré.");
				newStageForm();
			}
		}
	}

	public static void modifStageForm(long idStage){
		Agent agent = Agent.find("byEmail", Security.connected()).first();
		if (agent.niv.niv!=4){
			render("@accessDenied");
		}
		else{
			Stage stage=Stage.findById(idStage);
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			String dateDeb=sdf.format(stage.dateDeb);
			String dateFin=sdf.format(stage.dateFin);
			String dateExam=sdf.format(stage.dateExam);
			render(stage, agent, dateDeb, dateFin, dateExam, idStage);
		}
	}

	public static void gererStagesTermine(){
		//selection des stages en etat termine
		EtatStage et=EtatStage.findById(new Long(3));
		List<Stage> stages=Stage.find("etat like ?",et).fetch();
		render(stages);

	}
	
	public static void gererStageTermine(long id){
	  Stage stage = Stage.findById(id);
		render(id, stage);
	}

	public static void modifStage(Date dateDeb, Date dateFin, Date dateExam, long idStage){
		Agent agent = Agent.find("byEmail", Security.connected()).first();
		if (agent.niv.niv!=4){
			render("@accessDenied");
		}
		else{
			Stage stage=Stage.findById(idStage);
			stage.dateDeb=dateDeb;
			stage.dateFin=dateFin;
			if(dateExam.before(dateFin) || dateExam.equals(dateFin)){
				stage.dateExam=dateFin;
			}
			else{
				stage.dateExam=dateExam;
			}
			stage.save();
			flash.success("Le stage a bien été modifié");
			detailStage(idStage);
		}
	}

	public static void ajouterResponsablesForm(long idStage){
		Agent agent = Agent.find("byEmail", Security.connected()).first();
		if (agent.niv.niv<3){
			render("@accessDenied");
		}
		else{
			Stage stage=Stage.findById(idStage);
			List<Agent> agents=Agent.all().fetch();
			render(stage, agents, agent);
		}
	}

	public static void ajouterResponsables(long respPedag, long gestAdmin, long idStage){
		Agent agent = Agent.find("byEmail", Security.connected()).first();
		if (agent.niv.niv<3){
			render("@accessDenied");
		}
		else{
			Stage stage=Stage.findById(idStage);
			if(respPedag!=0){
				stage.directeur=Agent.findById(respPedag);
			}
			if(gestAdmin!=0){
				stage.gestionnaireAdmin=Agent.findById(gestAdmin);
			}
			flash.success("Le(s) responsable(s) a (ont) bien été ajouté(s) au stage.");
			stage.save();
			detailStage(idStage);
		}
	}

	public static void listCandid(long id){

		Stage stage = (Stage) Stage.findById(id);


		List<Candidat> candids=stage.getCandidatures();

		render(candids,stage);
	}
	
	public static void validerCompetences(long id){
		Stage stage=Stage.findById(id);
		List<Candidat> candids=stage.getCandidatures();
		List<Candidat> listeARender=new ArrayList<Candidat>();
		Iterator<Candidat> it=candids.iterator();
		Candidat tempCandid;
		
		//parcours des candidats du stage afin de n'afficher que les stagiaires.
		while (it.hasNext()){
			tempCandid=it.next();
			if(tempCandid.role.toString().equals("Stagiaire")){
				listeARender.add(tempCandid);
			}
		}
		render(listeARender);
	}
	
	public static void bilanPedago(long id){
		Stage stage=Stage.findById(id);
		List<Candidat> candids=stage.getCandidatures();
		List<Candidat> listeARender=new ArrayList<Candidat>();
		Iterator<Candidat> it=candids.iterator();
		Candidat tempCandid;
		
		//parcours des candidats du stage afin de n'afficher que les stagiaires.
		while (it.hasNext()){
			tempCandid=it.next();
			if(tempCandid.role.toString().equals("Stagiaire")){
				listeARender.add(tempCandid);
			}
		}
		render(listeARender);
	}

	public static void listStages(int id){
		
		/*Agent agent = Agent.find("byEmail", Security.connected()).first();
		System.out.println(agent.getId());
		System.out.println(agent.orgaStage.isEmpty());*/
		List<Stage> stages; 
		Date aujourdhui = new Date();
		//recuperation de la date du jour
		Calendar cal = Calendar.getInstance();
		//specification du format de sortie a utilise (celui reconnut par SQL)
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		//permet de n'afficher que les stages non passés
		if(id == 0)
		{
			//utilisation de la methode find() de play.
			//on convertit la date actuelle fournit par Calendar en utilisant le SimpleDateFormat creer
			//specification de date, dateDeb doit etre superieur a la date actuel et non nul.
			EtatStage terminer= EtatStage.findById(new Long(3));
			stages=Stage.find("dateDeb >= '"+sdf.format(cal.getTime())+"' and etat not like ?", terminer ).fetch();
		}
		//Affiche les stages passés
		else {
			EtatStage et=EtatStage.findById(new Long(3));
			stages=Stage.find("etat like ?",et).fetch();
		}
		render(stages, aujourdhui);
	}


	public static void detailStage(long id){		
		Stage stage = Stage.findById(id);
		//Candidature validée
		EtatCandid etat = EtatCandid.findById(new Long(5));
		List<Uv> uvs= stage.nature.uvs;
		List<Candidat> candidats = Candidat.find("stage like ? and etatCandid like ? ", stage, etat).fetch();
		// List<Candidat> candidats = stage.getCandidatures();
		Date aujourdhui = new Date();
		render(stage, candidats, aujourdhui, uvs);	

	}

	public static void detailscandid(long idStage, boolean logement, String motivation, long role, String precisionDate){	
		Agent agent = Agent.find("byEmail", Security.connected()).first();
		Stage stage = (Stage) Stage.findById(idStage);
		Candidat c = new Candidat(agent, stage, motivation, role);

		if(role != 0)
		{
			if(!motivation.equals("")){
				if(!stage.contientCandidat(c)){
					c.candidater(logement, role, precisionDate);
					agent.save();
					stage.save();
					flash.success("Votre candidature a bien été enregistrée");
					detailStage(stage.id);
				}
				else {
					Role roles = Role.findById(role);
					flash.error("Vous ne pouvez pas candidater en tant que "+roles.toString()+" pour ce stage");
					detailStage(stage.id);
				}
			}
			else {
				flash.error("Vous devez remplir le champ motivation");
				detailStage(stage.id);
			}
		}
		else {
			flash.error("Vous devez choisir un rôle pour ce stage");
			candidStage(stage.id);
		}
	}

	public static void candidStage(long id)
	{
		Stage stage = (Stage) Stage.findById(id);
		Agent agent = Agent.find("byEmail", Security.connected()).first();
		List<Role> roles = Role.all().fetch();
		render(stage, roles, agent);

	}

}